package com.xj.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 同构字符串
 */
public class L205_同构字符串 {

    /**
     *给定两个字符串 s 和 t，判断它们是否是同构的。
     *
     * 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
     *
     * 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。
     *
     * 示例 1:
     *
     * 输入: s = "egg", t = "add"
     * 输出: true
     * 示例 2:
     *
     * 输入: s = "foo", t = "bar"
     * 输出: false
     * 示例 3:
     *
     * 输入: s = "paper", t = "title"
     * 输出: true
     * 说明:
     * 你可以假设 s 和 t 具有相同的长度。
     */

    public static void main(String[] args) {
        System.out.println(isIsomorphicGood("egg","add"));
        System.out.println(isIsomorphicGood("foo","bar"));
        System.out.println(isIsomorphicGood("paper","title"));
        System.out.println(isIsomorphicGood("ab","aa"));
    }

    //自己的解法：遍历1遍，判断映射关系是否一致
    public static boolean isIsomorphic(String s, String t) {
        if(s==null && t==null){
            return true;
        }
        int sLength=s.length();
        int tLength=t.length();
        if(sLength!=tLength){
            return false;
        }

        Map<Character,Character> sMap=new HashMap<>();
        Map<Character,Character> tMap=new HashMap<>();
        char[] sArr=s.toCharArray();
        char[] tArr=t.toCharArray();
        for (int i=0;i<sLength;i++){
            if(sMap.get(sArr[i])==null && tMap.get(tArr[i])==null) {
                sMap.put(sArr[i], tArr[i]);
                tMap.put(tArr[i], sArr[i]);
            }else if(sMap.get(sArr[i])==null && tMap.get(tArr[i])!=null){
                return false;
            }else if(sMap.get(sArr[i])!=null){
                if(sMap.get(sArr[i])!=tArr[i]){
                    return false;
                }
            }
        }
        return true;
    }

    //精彩解法：找下标
    public static boolean isIsomorphicGood(String s, String t) {
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            if(s.indexOf(ch1[i]) != t.indexOf(ch2[i])){
                return false;
            }
        }
        return true;
    }
}